package com.peaksport.framework.base.venum;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.peaksport.framework.exception.PKDevException;
import com.peaksport.framework.util.PKInvokeUtils;

import lombok.Getter;
import lombok.Setter;

/**
 * 
 *  状态枚举(整型)
 * 
 * @author jinbin_guo  2019年4月16日 下午4:37:52
 *
 */
@SuppressWarnings("serial")
@Getter
@Setter
public class BaseIntEnum extends BaseEnum {

    private int value;
    private String display;

    public BaseIntEnum() {}
    public BaseIntEnum(int value) {
        this.value = value;
    }
    public BaseIntEnum(int value, String display) {
        this.value = value;
        this.display = display;
    }

    public static BaseIntEnum getEnum(Class<?> clazz, int value) {
        BaseIntEnum intEnum = (BaseIntEnum) PKInvokeUtils.newInstance(clazz);
        return intEnum._getEnum(value);
    }

    private BaseIntEnum _getEnum(int value) {
        Map<Integer,BaseIntEnum> map = _getEnumMap();
        BaseIntEnum baseIntEnum = map.get(value);
        if (baseIntEnum == null) {
            throw PKDevException.throwException("枚举[%s]不存在值[%d]",getClass().getName(),value);
        }
        return baseIntEnum;
    }

    public static List<BaseIntEnum> getEnumList(Class<?> clazz) {
        BaseIntEnum intEnum = (BaseIntEnum) PKInvokeUtils.newInstance(clazz);
        return intEnum._getEnumList();
    }

    private List<BaseIntEnum> _getEnumList() {
        List<BaseIntEnum> list = new ArrayList<>();
        try{
            Field[] field = this.getClass().getFields();
            for (int i = 0,len = field.length; i < len; i++) {
                if (BaseIntEnum.class.isAssignableFrom(field[i].getType())) {
                    BaseIntEnum intEnum = (BaseIntEnum)PKInvokeUtils.getFieldValue(this,field[i].getName());
                    list.add(intEnum) ;
                }
            }
            return list;
        } catch (Exception exc) {
             throw new PKDevException(exc);
        }
    }
    public static Map<Integer,BaseIntEnum> getEnumMap(Class<?> clazz) {
        BaseIntEnum intEnum = (BaseIntEnum) PKInvokeUtils.newInstance(clazz);
        return intEnum._getEnumMap();
    }
    private Map<Integer,BaseIntEnum> _getEnumMap() {
        Map<Integer,BaseIntEnum> map = new HashMap<>();
        try{
            Field[] field = this.getClass().getFields();
            for (int i = 0,len = field.length; i < len; i++) {
                if (BaseIntEnum.class.isAssignableFrom(field[i].getType())) {
                    BaseIntEnum intEnum = (BaseIntEnum)PKInvokeUtils.getFieldValue(this,field[i].getName());
                    map.put(intEnum.getValue(),intEnum);
                }
            }
            return map;
        } catch (Exception exc) {
            throw new PKDevException(exc);
        }

    };

    public String _toJSON() {
        StringBuffer json = new StringBuffer();
        json.append("{value:").append(value);
        if (display != null) {
            json.append(",display:'").append(display).append("'");
        }
        json.append("}");

        return json.toString();
    }

    public static String toJSON(Class<?> clazz) {
        List<BaseIntEnum> lstIntEnum = getEnumList(clazz);
        StringBuffer json = new StringBuffer();
        json.append("[");
        for (int i = 0, len = lstIntEnum.size(); i < len; i++) {
            BaseIntEnum baseIntEnum = lstIntEnum.get(i);
            json.append(baseIntEnum._toJSON());
            if (i != len-1) json.append(",");
        }
        json.append("]");
        return json.toString();
    }
}
